/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.Controlador;


import com.dp1.pucp.Modelo.Clases.*;
import com.dp1.pucp.Logistica.DAO.*;
import com.dp1.pucp.Logistica.Vista.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;

/**
 *
 * @author ubuntu64
 */
public class AjustesAlmacenControlador {
    private TipoProductoDAO m;
    private Tipoproducto tipoProducto;
    private Presentacion presentacion;
    private AjustesAlmacenGUI2 ajustesAlmacenView;
    private Almacen alm;
    private ArrayList<String> lstTipo;
    private ArrayList<String> lstMotivo;
    private ArrayList<Almacen> lstAlmacen;
    private MantAlmacenControlador mantTipoProductoControlador;

    public AjustesAlmacenControlador(TipoProductoDAO dao, AjustesAlmacenGUI2 view){
        m = dao;
        ajustesAlmacenView = view;
            llenarTipoCombo();
            llenarAlmacen();
            llenarMotivo();
        ajustesAlmacenView.addLimpiarListener(new limpiarListener());              
        ajustesAlmacenView.addGuardarListener(new guardarAjusteAlmacenListener());
        ajustesAlmacenView.addVerAlmacenListener(new verDetalleAlmacenListener(this));
        ajustesAlmacenView.addBuscarProductoListener(new buscarProductoListener(this));
        ajustesAlmacenView.addBuscarPresentacionListener(new buscarPresentacionListener(this));
    }
    
    
    public AjustesAlmacenControlador(TipoProductoDAO dao, AjustesAlmacenGUI2 view,Tipoproducto u){
        m = dao;
        ajustesAlmacenView = view;
        tipoProducto=u;
        ajustesAlmacenView.setFormUsuarioT(tipoProducto);
    }
    
    public AjustesAlmacenControlador(TipoProductoDAO dao, AjustesAlmacenGUI2 view,Presentacion p){
        m = dao;
        ajustesAlmacenView = view;
        presentacion=p;
        ajustesAlmacenView.setFormUsuarioP(presentacion);
    }
    
    
    class buscarProductoListener implements ActionListener{
        
        private AjustesAlmacenControlador buc;
        public buscarProductoListener(AjustesAlmacenControlador buscarusr){
            buc=buscarusr;
        }
              
        @Override
        public void actionPerformed(ActionEvent e) {
            BuscarProductoGUI p = new BuscarProductoGUI(ajustesAlmacenView.getPadre(), true);
            BuscarProductoControlador d = new BuscarProductoControlador(m,p,ajustesAlmacenView);
            p.setVisible(true);
        }      
    }
    
    class buscarPresentacionListener implements ActionListener{
        
        private AjustesAlmacenControlador buc;
        public buscarPresentacionListener(AjustesAlmacenControlador buscarusr){
            buc=buscarusr;
        }
              
        @Override
        public void actionPerformed(ActionEvent e) {
            BuscarPresentacionGUI p = new BuscarPresentacionGUI(ajustesAlmacenView.getPadre(), true);
            BuscarPresentacionControlador d = new BuscarPresentacionControlador(m,p,ajustesAlmacenView);
            p.setVisible(true);
        }      
    }
    
    class verDetalleAlmacenListener implements ActionListener{
        
        private AjustesAlmacenControlador buc;
        public verDetalleAlmacenListener(AjustesAlmacenControlador buscarusr){
            buc=buscarusr;
        }
              
        @Override
        public void actionPerformed(ActionEvent e) {
            
            DetalleAlmacenGUI p = new DetalleAlmacenGUI(ajustesAlmacenView.getPadre(), true);
            DetalleAlmacenControlador d = new DetalleAlmacenControlador(m,p,ajustesAlmacenView);
            p.setVisible(true);
        }      
    }
    
    private void llenarTipoCombo(){
        lstTipo = m.listarTipo();
        ajustesAlmacenView.llenaComboTipo(lstTipo);
    } 
    
    
    private void llenarMotivo(){
        lstMotivo = m.listarMotivoA();
        ajustesAlmacenView.llenaComboMotivo(lstMotivo);
    } 
    
    private void llenarAlmacen(){
        lstAlmacen = m.listarAlmacenes();
        ajustesAlmacenView.llenaComboAlmacen(lstAlmacen);
    } 
    
        
    class guardarAjusteAlmacenListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            int idAlmacen=ajustesAlmacenView.getAlmacen();

            int idTipoProducto=Integer.parseInt(ajustesAlmacenView.getIdTipoProducto());
            Almacen b=new Almacen();
            idAlmacen++;
            b.setIdalmacen(idAlmacen);
            
            Tipoproducto c=new Tipoproducto();
            c.setIdtipoproducto(idTipoProducto);
       
            Productofinal a=new Productofinal();

            //ACA TRABAJO SOLO CON EL ALMACEN 3 que es el de productoFINAL
            if (idAlmacen==3){
                
                 int idPresentacion=Integer.parseInt(ajustesAlmacenView.getIdPresentacion());
                 Presentacion d=new Presentacion();
                 d.setIdpresentacion(idPresentacion);
                 
            //Se busca la cantidad de concidencias de la lista con estado =1,estan en almacen
            Productofinal productoFinal=m.sacaListaAjusteAlmacen(idAlmacen,idPresentacion,idTipoProducto);
            
            
            //Long cantMinPolProd=productoFinal.getTipoproducto().getMinPolitica();
            ArrayList<Tipoproducto> prod=m.listarGenerarTipoProducto(idTipoProducto);

            //int can=(int)cantMinPolProd;
            float cantMinPInt=Float.valueOf(prod.get(0).getMinPolitica()+"");

            float cantProductoFinal=productoFinal.getCantidad();
            //int cantProdF=Float.parseFloat(String.valueOf(cantProductoFinal));

            int cantA=Integer.parseInt(ajustesAlmacenView.getCantidad());
            float cant_A=cantA;
            
            float cantAjuste=Float.parseFloat(String.valueOf(cantA));
            
            
            
            if(cantProductoFinal-cant_A>=cantMinPInt){//se cumple la politica de stock se puede dar el ajuste
            
            //Ahora comparamos cantidades, si cantAjuste<cantProductoFinal, resto cantProductoFinal-cantAjuste y lo almaceno
            //Campo Cantidad de tabla productofinal, y despues almaceno un registro en kardex
            
            
            //ACA TENGO QUE VER EL MOTIVO PARA VER SI RESTO O SUMO 
            if(cantProductoFinal>cantAjuste){
                //se hace un update
                float cantNueva=cantProductoFinal-cantAjuste;
     
                a.setIdproductofinal(productoFinal.getIdproductofinal());
                
                
                if(ajustesAlmacenView.getMotivo()==0 || ajustesAlmacenView.getMotivo()==1)
                    a.setCantidad(cantNueva);
                else
                    a.setCantidad(cantA+cantProductoFinal);
                
                a.setAlmacen(b);
                a.setTipoproducto(c);
                a.setPresentacion(d);
                a.setFechaCaducidad(productoFinal.getFechaCaducidad());
                a.setCodigo(productoFinal.getCodigo());
                a.setDescripcion(productoFinal.getDescripcion());
                a.setEstado(productoFinal.getEstado());
                a.setLote(productoFinal.getLote());
                
                m.guardarProductoFinal(a);
           
                //Se agrega en kardex
                Kardex k=new Kardex();
                
                Date date= new Date();
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yyyy");
                String StringFecha=simpleDateFormat.format(date);
        
                DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
                String StringHour=hourFormat.format(date);
                
                Integer tipo=ajustesAlmacenView.getTipo();
                
                if(tipo==0){
                    k.setTipo("MP");
                }
                if(tipo==1){
                    k.setTipo("PI");
                }
                if(tipo==2){
                    k.setTipo("PF");
                }
                
                k.setCantidad(Long.parseLong(ajustesAlmacenView.getCantidad()));
                k.setEstado(1);
                
                Integer motivo=ajustesAlmacenView.getMotivo();
                
                if(motivo==0){
                    k.setMotivo("Rotura");
                }
                if(motivo==1){
                    k.setMotivo("Defecto");
                }
                if(motivo==2){
                    k.setMotivo("Reingreso");
                }

                k.setTipoproducto(c);
                
                if(k.getMotivo().equals("Rotura") || k.getMotivo().equals("Defecto"))
                    k.setEntradasalida('S');
                else//Aca es cuando es "Reingreso"
                    k.setEntradasalida('E');
                
                
                k.setAlmacen(a.getAlmacen());
 
                SimpleDateFormat formatoF = new SimpleDateFormat("dd/MM/yyyy");
                String strFechaF = StringFecha;
                Date fechaDateF = null;
                try {
                fechaDateF = formatoF.parse(strFechaF);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
                
                SimpleDateFormat formatoH = new SimpleDateFormat("HH:mm:ss");
                String strFechaH = StringHour;
                Date fechaDateH = null;
                try {
                fechaDateH = formatoH.parse(strFechaH);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }

                k.setFecha(fechaDateF);
                k.setHora(fechaDateH);
                
                m.guardarAjuste(k);
                ajustesAlmacenView.mostrarAviso("Se guardo exitosamente ajuste de Producto Final");  
                }
  
                else{
                
                
                
                //Mensaje que no se tiene cantidad de ese producto en tal presentacion
                    ajustesAlmacenView.mostrarAviso("No se tiene la cantidad del Producto Final necesaria para el ajuste"); 
                }
            }
                else{//aca no se cumple con las Minimas de Stock
                if(ajustesAlmacenView.getMotivo()==2){
                    a.setIdproductofinal(productoFinal.getIdproductofinal());
                    a.setCantidad(cantA+cantProductoFinal);
                    
                    a.setAlmacen(b);
                    a.setTipoproducto(c);
                    a.setPresentacion(d);
                    a.setFechaCaducidad(productoFinal.getFechaCaducidad());
                    a.setCodigo(productoFinal.getCodigo());
                    a.setDescripcion(productoFinal.getDescripcion());
                    a.setEstado(productoFinal.getEstado());
                    a.setLote(productoFinal.getLote());
                
                    m.guardarProductoFinal(a);
                
                     //Se agrega en kardex
                    Kardex k=new Kardex();
                
                    Date date= new Date();
                    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yyyy");
                    String StringFecha=simpleDateFormat.format(date);
        
                    DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
                    String StringHour=hourFormat.format(date);
                
                    Integer tipo=ajustesAlmacenView.getTipo();
                
                    if(tipo==0){
                        k.setTipo("MP");
                    }
                    if(tipo==1){
                        k.setTipo("PI");
                    }
                    if(tipo==2){
                        k.setTipo("PF");
                    }
                
                    k.setCantidad(Long.parseLong(ajustesAlmacenView.getCantidad()));
                    k.setEstado(1);
                
                    Integer motivo=ajustesAlmacenView.getMotivo();
                
                    if(motivo==0){
                        k.setMotivo("Rotura");
                    }
                    if(motivo==1){
                        k.setMotivo("Defecto");
                    }
                    if(motivo==2){
                        k.setMotivo("Reingreso");
                    }

                    k.setTipoproducto(c);
                
                    if(k.getMotivo().equals("Rotura") || k.getMotivo().equals("Defecto"))
                        k.setEntradasalida('S');
                    else//Aca es cuando es "Reingreso"
                        k.setEntradasalida('E');
                
                
                    k.setAlmacen(a.getAlmacen());
 
                    SimpleDateFormat formatoF = new SimpleDateFormat("dd/MM/yyyy");
                    String strFechaF = StringFecha;
                    Date fechaDateF = null;
                    try {
                    fechaDateF = formatoF.parse(strFechaF);
                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }
                
                    SimpleDateFormat formatoH = new SimpleDateFormat("HH:mm:ss");
                    String strFechaH = StringHour;
                    Date fechaDateH = null;
                    try {
                    fechaDateH = formatoH.parse(strFechaH);
                    } catch (ParseException ex) {
                    ex.printStackTrace();
                    }

                    k.setFecha(fechaDateF);
                    k.setHora(fechaDateH);
                
                    m.guardarAjuste(k);
                    ajustesAlmacenView.mostrarAviso("Se guardo exisamente el ajuste de Producto Final");      
                    
                
                    }
                    else
                    ajustesAlmacenView.mostrarAviso("No se puede realizar el ajuste, infringe el Minimo de Politica");
                }
            
            }
            //ACA TRABAJAMOS CON EL ALMACEN DE MATERIA PRIMA
            
            
                 
            Materiaprima materiaPrima=m.sacaListaAjusteMateriaPrimaAlmacen(idAlmacen,idTipoProducto); 
            int codProd=materiaPrima.getTipoproducto().getIdtipoproducto();
            Tipoproducto matP=new Tipoproducto();
            matP.setIdtipoproducto(codProd);
            
            if(idAlmacen==1){
            
            
            int cantMateriaPrima=materiaPrima.getCantidad();
            int cantA=Integer.parseInt(ajustesAlmacenView.getCantidad());
            long cantMinPInt=materiaPrima.getTipoproducto().getMinPolitica();
            
            
            
            if(cantMateriaPrima-cantA>=cantMinPInt){
            
            
            
            

                if(cantMateriaPrima>cantA){
                    //se hace un update
                    int cantNueva=cantMateriaPrima-cantA;

                    Materiaprima p=new Materiaprima();
                    p.setIdmateriaprima(materiaPrima.getIdmateriaprima());

                
                    if(ajustesAlmacenView.getMotivo()==0 || ajustesAlmacenView.getMotivo()==1)
                        p.setCantidad(cantNueva);
                    else
                        p.setCantidad(cantA+cantMateriaPrima);

                    p.setAlmacen(b);
                    p.setTipoproducto(matP);
                    p.setFechaCaducidad(materiaPrima.getFechaCaducidad());
                    p.setCodigo(materiaPrima.getCodigo());
                    p.setEstado(materiaPrima.getEstado());
                    p.setLote(materiaPrima.getLote());
                    p.setVolumen(materiaPrima.getVolumen());

                    m.guardarMP(p);

                    //Se agrega en kardex
                    Kardex k=new Kardex();

                    Date date= new Date();
                    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yyyy");
                    String StringFecha=simpleDateFormat.format(date);

                    DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
                    String StringHour=hourFormat.format(date);

                    Integer tipo=ajustesAlmacenView.getTipo();

                    if(tipo==0){
                        k.setTipo("MP");
                    }
                    if(tipo==1){
                        k.setTipo("PI");
                    }
                    if(tipo==2){
                        k.setTipo("PF");
                    }

                    k.setCantidad(Long.parseLong(ajustesAlmacenView.getCantidad()));
                    k.setEstado(1);

                    Integer motivo=ajustesAlmacenView.getMotivo();

                    if(motivo==0){
                        k.setMotivo("Rotura");
                    }
                    if(motivo==1){
                        k.setMotivo("Defecto");
                    }
                    if(motivo==2){
                        k.setMotivo("Reingreso");
                    }
               
                    k.setTipoproducto(c);
                
                    if(k.getMotivo().equals("Rotura") || k.getMotivo().equals("Defecto"))
                        k.setEntradasalida('S');
                    else//Aca es cuando es "Reingreso"
                        k.setEntradasalida('E');
                
                
                    k.setAlmacen(p.getAlmacen());
 
                    SimpleDateFormat formatoF = new SimpleDateFormat("dd/MM/yyyy");
                    String strFechaF = StringFecha;
                    Date fechaDateF = null;
                    try {
                    fechaDateF = formatoF.parse(strFechaF);

                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }
                
                    SimpleDateFormat formatoH = new SimpleDateFormat("HH:mm:ss");
                    String strFechaH = StringHour;
                    Date fechaDateH = null;
                    try {
                    fechaDateH = formatoH.parse(strFechaH);
  
                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }

                    k.setFecha(fechaDateF);
                    k.setHora(fechaDateH);
                
                    m.guardarAjuste(k);
                    ajustesAlmacenView.mostrarAviso("Se guardo exitosamente  el ajuste de Materia Prima");
                }
            }
                else{
                    
                    
                    if(ajustesAlmacenView.getMotivo()==2){
                    int cantNueva=cantMateriaPrima-cantA;

                    Materiaprima p=new Materiaprima();
                    p.setIdmateriaprima(materiaPrima.getIdmateriaprima());

                
                    if(ajustesAlmacenView.getMotivo()==0 || ajustesAlmacenView.getMotivo()==1)
                        p.setCantidad(cantNueva);
                    else
                        p.setCantidad(cantA+cantMateriaPrima);

                    p.setAlmacen(b);
                    p.setTipoproducto(matP);
                    p.setFechaCaducidad(materiaPrima.getFechaCaducidad());
                    p.setCodigo(materiaPrima.getCodigo());
                    p.setEstado(materiaPrima.getEstado());
                    p.setLote(materiaPrima.getLote());
                    p.setVolumen(materiaPrima.getVolumen());

                    m.guardarMP(p);

                    //Se agrega en kardex
                    Kardex k=new Kardex();

                    Date date= new Date();
                    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yyyy");
                    String StringFecha=simpleDateFormat.format(date);

                    DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
                    String StringHour=hourFormat.format(date);

                    Integer tipo=ajustesAlmacenView.getTipo();

                    if(tipo==0){
                        k.setTipo("MP");
                    }
                    if(tipo==1){
                        k.setTipo("PI");
                    }
                    if(tipo==2){
                        k.setTipo("PF");
                    }

                    k.setCantidad(Long.parseLong(ajustesAlmacenView.getCantidad()));
                    k.setEstado(1);

                    Integer motivo=ajustesAlmacenView.getMotivo();

                    if(motivo==0){
                        k.setMotivo("Rotura");
                    }
                    if(motivo==1){
                        k.setMotivo("Defecto");
                    }
                    if(motivo==2){
                        k.setMotivo("Reingreso");
                    }
               
                    k.setTipoproducto(c);
                
                    if(k.getMotivo().equals("Rotura") || k.getMotivo().equals("Defecto"))
                        k.setEntradasalida('S');
                    else//Aca es cuando es "Reingreso"
                        k.setEntradasalida('E');
                
                
                    k.setAlmacen(p.getAlmacen());
 
                    SimpleDateFormat formatoF = new SimpleDateFormat("dd/MM/yyyy");
                    String strFechaF = StringFecha;
                    Date fechaDateF = null;
                    try {
                    fechaDateF = formatoF.parse(strFechaF);

                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }
                
                    SimpleDateFormat formatoH = new SimpleDateFormat("HH:mm:ss");
                    String strFechaH = StringHour;
                    Date fechaDateH = null;
                    try {
                    fechaDateH = formatoH.parse(strFechaH);
  
                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }

                    k.setFecha(fechaDateF);
                    k.setHora(fechaDateH);
                
                    m.guardarAjuste(k);
                       ajustesAlmacenView.mostrarAviso("Se guardo exitosamente  el ajuste de Materia Prima");
                    }
                    else{
            //Mensaje que no se tiene cantidad de ese producto en tal presentacion
                    ajustesAlmacenView.mostrarAviso("No se tiene la cantidad de Materia Prima necesaria para el ajuste");
                
                    } 
            }
            }
            }
        
            //sino mando un mensaje informativo

                 
        }
    

 class limpiarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            ajustesAlmacenView.LimpiarDatos();
        }        
    } 
}
